<html>
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/>
  <title>
   丹张: RHadoop实践系列之三 R实现MapReduce的协同过滤算法  | 数螺 | NAUT IDEA
  </title>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" rel="stylesheet"/>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
  <style type="text/css">
   #xmain img {
                  max-width: 100%;
                  display: block;
                  margin-top: 10px;
                  margin-bottom: 10px;
                }

                #xmain p {
                    line-height:150%;
                    font-size: 16px;
                    margin-top: 20px;
                }

                #xmain h2 {
                    font-size: 24px;
                }

                #xmain h3 {
                    font-size: 20px;
                }

                #xmain h4 {
                    font-size: 18px;
                }


                .header {
	           background-color: #0099ff;
	           color: #ffffff;
	           margin-bottom: 20px;
	        }

	        .header p {
                  margin: 0px;
                  padding: 10px 0;
                  display: inline-block;  
                  vertical-align: middle;
                  font-size: 16px;
               }

               .header a {
                 color: white;
               }

              .header img {
                 height: 25px;
              }
  </style>
  <script src="http://cdn.bootcss.com/jquery/3.0.0/jquery.min.js">
  </script>
  <script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript">
   MathJax.Hub.Config({
          tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]},
          TeX: {equationNumbers: {autoNumber: "AMS"}}
        });
  </script>
  <script src="http://nautstatic-10007657.file.myqcloud.com/static/css/readability.min.js" type="text/javascript">
  </script>
  <script type="text/javascript">
   $(document).ready(function() {
                 var loc = document.location;
                 var uri = {
                  spec: "http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/",
                  host: "http://cos.name",
                  prePath: "http://cos.name",
                  scheme: "http",
                  pathBase: "http://cos.name/"
                 };
    
                 var documentClone = document.cloneNode(true);
                 var article = new Readability(uri, documentClone).parse();
     
                 document.getElementById("xmain").innerHTML = article.content;
                });
  </script>
  <!-- 1466461600: Accept with keywords: (title(0.428571428571):协同,门户网站,Hadoop,统计学,算法,服务平台,中国, topn(0.5):异构,爱好者,Hadoop,统计学,R语言,内存,数据分析,协同,结果,数据源,hadoop,计算,文章,物品,格式,排序,部分,向量,评分,矩阵,用户,问题,计数,算法,文字说明,数据,代码,测试数据,列表,评论).-->
 </head>
 <body class="single single-post postid-7619 single-format-standard sidebar" onload="">
  <div class="header">
   <div class="container">
    <div class="row">
     <div class="col-xs-6 col-sm-6 text-left">
      <a href="/databee">
       <img src="http://nautidea-10007657.cos.myqcloud.com/logo_white.png"/>
      </a>
      <a href="/databee">
       <p>
        数螺
       </p>
      </a>
     </div>
     <div class="hidden-xs col-sm-6 text-right">
      <p>
       致力于数据科学的推广和知识传播
      </p>
     </div>
    </div>
   </div>
  </div>
  <div class="container text-center">
   <h1>
    丹张: RHadoop实践系列之三 R实现MapReduce的协同过滤算法
   </h1>
  </div>
  <div class="container" id="xmain">
   <div class="hfeed site" id="page">
    <header class="site-header" id="masthead" role="banner">
     <div id="cos-logo">
      <a href="http://cos.name/">
       <img src="http://cos.name/wp-content/themes/COS-kermesinus/images/headers/cos-logo.png"/>
      </a>
     </div>
     <div class="navbar" id="navbar">
      <nav class="navigation main-navigation" id="site-navigation" role="navigation">
       <h3 class="menu-toggle">
        菜单
       </h3>
       <a class="screen-reader-text skip-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#content" title="跳至内容">
        跳至内容
       </a>
       <div class="menu-%e6%88%91%e7%9a%84%e8%8f%9c%e5%8d%95-container">
        <ul class="nav-menu" id="menu-%e6%88%91%e7%9a%84%e8%8f%9c%e5%8d%95">
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-4746" id="menu-item-4746">
          <a href="http://cos.name">
           主页
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-8120" id="menu-item-8120">
          <a href="http://cos.name/cn">
           论坛
          </a>
          <ul class="sub-menu">
           <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-8124" id="menu-item-8124">
            <a href="http://cos.name/cn/wp-login.php?action=register">
             论坛注册
            </a>
           </li>
           <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-8125" id="menu-item-8125">
            <a href="http://cos.name/cn/wp-login.php">
             论坛登录
            </a>
           </li>
          </ul>
         </li>
         <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-8110" id="menu-item-8110">
          <a href="http://cos.name/books/">
           图书资料
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-8112" id="menu-item-8112">
          <a href="http://cos.name/videos">
           视频教程
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-8333" id="menu-item-8333">
          <a href="http://cos.name/salon/">
           统计沙龙
          </a>
         </li>
         <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-8111" id="menu-item-8111">
          <a href="http://cos.name/chinar/">
           R语言会议
          </a>
         </li>
         <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-8109" id="menu-item-8109">
          <a href="http://cos.name/training/">
           讲座与培训
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-8115" id="menu-item-8115">
          <a href="http://cos.name/cn/forum/comprehensive/job/">
           招聘信息
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-4780" id="menu-item-4780">
          <a href="http://cos.name/about">
           关于我们
          </a>
          <ul class="sub-menu">
           <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-8113" id="menu-item-8113">
            <a href="http://cos.name/2008/11/how-to-work-with-cos/">
             加入我们
            </a>
           </li>
           <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-8119" id="menu-item-8119">
            <a href="http://cos.name/donate/">
             赞助我们
            </a>
           </li>
           <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-8114" id="menu-item-8114">
            <a href="http://cos.name/cn/forum/26">
             项目合作
            </a>
           </li>
          </ul>
         </li>
        </ul>
       </div>
       <form action="http://cos.name/" class="search-form" method="get" role="search">
        <label>
         <span class="screen-reader-text">
          搜索：
         </span>
        </label>
       </form>
      </nav>
      <!-- #site-navigation -->
     </div>
     <!-- #navbar -->
    </header>
    <!-- #masthead -->
    <div class="site-main" id="main">
     <div class="content-area" id="primary">
      <div class="site-content" id="content" role="main">
       <article class="post-7619 post type-post status-publish format-standard hentry category-data category-software tag-hadoop tag-mahout tag-mapreduce tag-rhadoop tag-668 tag-450" id="post-7619">
        <header class="entry-header">
         <h1 class="entry-title">
          RHadoop实践系列之三 R实现MapReduce的协同过滤算法
         </h1>
         <div class="entry-meta">
          <span class="date">
           <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/" rel="bookmark" title="链向RHadoop实践系列之三 R实现MapReduce的协同过滤算法的固定链接">
            <time class="entry-date" datetime="2013-04-09T12:30:29+00:00">
             2013/04/09
            </time>
           </a>
          </span>
          <span class="categories-links">
           <a href="http://cos.name/category/data/" rel="category tag">
            数据分析
           </a>
           、
           <a href="http://cos.name/category/software/" rel="category tag">
            软件应用
           </a>
          </span>
          <span class="tags-links">
           <a href="http://cos.name/tag/hadoop/" rel="tag">
            hadoop
           </a>
           、
           <a href="http://cos.name/tag/mahout/" rel="tag">
            mahout
           </a>
           、
           <a href="http://cos.name/tag/mapreduce/" rel="tag">
            MapReduce
           </a>
           、
           <a href="http://cos.name/tag/rhadoop/" rel="tag">
            rhadoop
           </a>
           、
           <a href="http://cos.name/tag/%e5%8d%8f%e5%90%8c%e8%bf%87%e6%bb%a4/" rel="tag">
            协同过滤
           </a>
           、
           <a href="http://cos.name/tag/%e6%8e%a8%e8%8d%90%e7%b3%bb%e7%bb%9f/" rel="tag">
            推荐系统
           </a>
          </span>
          <span class="author vcard">
           <a class="url fn n" href="http://cos.name/author/conan/" rel="author" title="查看所有由张 丹发布的文章">
            张 丹
           </a>
          </span>
         </div>
         <!-- .entry-meta -->
        </header>
        <!-- .entry-header -->
        <div class="entry-content">
         <h1>
         </h1>
         <p>
          Author：张丹(Conan)
          <br/>
          Date: 2013-04-07
         </p>
         <p>
          Weibo: @Conan_Z
          <br/>
          Email:
          <a href="mailto:bsspirit@gmail.com">
           bsspirit@gmail.com
          </a>
          <br/>
          Blog:
          <a href="http://www.fens.me/blog">
           http://www.fens.me/blog
          </a>
         </p>
         <p>
          APPs:
          <br/>
          @晒粉丝
          <a href="http://www.fens.me">
           http://www.fens.me
          </a>
          <br/>
          @每日中国天气
          <a href="http://apps.weibo.com/chinaweatherapp">
           http://apps.weibo.com/chinaweatherapp
          </a>
         </p>
         <h2>
          RHadoop实践系列文章
         </h2>
         <p>
          RHadoop实践系列文章，包含了R语言与Hadoop结合进行海量数据分析。Hadoop主要用来存储海量数据，R语言完成MapReduce 算法，用来替代Java的MapReduce实现。有了RHadoop可以让广大的R语言爱好者，有更强大的工具处理大数据。1G, 10G, 100G, TB,PB 由于大数据所带来的单机性能问题，可能会一去联复返了。
         </p>
         <p>
          RHadoop实践是一套系列文章，主要包括”Hadoop环境搭建”，”RHadoop安装与使用”，”R实现MapReduce的算法案 例”，”HBase和rhbase的安装与使用”。对于单独的R语言爱好者，Java爱好者，或者Hadoop爱好者来说，同时具备三种语言知识并不容 易。
         </p>
         <p>
          由于rmr2的对hadoop操作有一些特殊性，代码实现有一定难度。需要深入学习的同学，请多尝试并思考key/value值的设计。
         </p>
         <p>
          本文难度为中高级。
         </p>
         <p>
          <span id="more-7619">
          </span>
         </p>
         <h2>
          第三篇 R实现MapReduce的协同过滤算法，分为3个章节。
         </h2>
         <pre><code>1.基于物品推荐的协同过滤算法介绍
2.R本地程序实现
3.R基于Hadoop分步式程序实现
</code></pre>
         <p>
          每一章节，都会分为”文字说明部分”和”代码部分”，保持文字说明与代码的连贯性。
         </p>
         <p>
          注：Hadoop环境及RHadoop的环境，请查看同系列前二篇文章，此文将不再介绍。
         </p>
         <h2>
          1. 基于物品推荐的协同过滤算法介绍
         </h2>
         <h4>
          文字说明部分：
         </h4>
         <p>
          越来越多的互联网应用，都开始使用推荐算法(协同过滤算法)。根据用户活跃度和物品流行度，可以分为”基于用户的协同过滤算法”和”基于物品的协同过滤算法”。
         </p>
         <p>
          基于用户的协同过滤算法，是给用户推荐和他兴趣相似的其他用户喜欢的物品。
          <br/>
          基于物品的协同过滤算法，是给用户推荐和他之前喜欢的物品相似的物品。
          <br/>
          基于物品的协同过滤算法，是目前广泛使用的一种推荐算法，像Netflix, YouTube, Amazon等。
         </p>
         <p>
          算法主要分为两步：
          <br/>
          1. 计算物品之间的相似度
          <br/>
          2. 根据物品的相似度和用户的历史行为给用户生成推荐列表
         </p>
         <p>
          有关算法的细节请参考：”Mahout In Action”和”推荐系统实践”两本书。
         </p>
         <p>
          为开发方便，我们选择一组很小的测试数据集。
         </p>
         <p>
          测试数据，来自于”Mahout In Action” P49
          <br/>
          原第8行，3,101,2.5 改为 3,101,2.0
          <br/>
          每行3个字段，依次是用户ID,物品ID,对物品的评分
         </p>
         <h4>
          <strong>
           代码部分：
          </strong>
         </h4>
         <p>
          在服务上创建测试数据文件small.csv
         </p>
         <pre><code>~ pwd

/root/R

~ vi small.csv

1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.0
3,104,4.0
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0

~ ls

small.csv
</code></pre>
         <h2>
          2. R本地程序实现
         </h2>
         <p>
          首先，通过R语言实现基于物品的协同过滤算法，为和RHadoop实现进行对比。这里我使用”Mahout In Action”书里，第一章第六节介绍的分步式基于物品的协同过滤算法进行实现。Chapter 6: Distributing recommendation computations
         </p>
         <p>
          算法的思想：
          <br/>
          1. 建立物品的同现矩阵
          <br/>
          2. 建立用户对物品的评分矩阵
          <br/>
          3. 矩阵计算推荐结果
         </p>
         <h4>
          <strong>
           文字说明部分：
          </strong>
         </h4>
         <p>
          1. 建立物品的同现矩阵
         </p>
         <p>
          按用户分组，找到每个用户所选的物品，单独出现计数，及两两一组计数。
         </p>
         <p>
          例如：用户ID为3的用户，分别给101,104,105,107，这4个物品打分。
          <br/>
          1) (101,101),(104,104),(105,105),(107,107)，单独出现计算各加1。
          <br/>
          2) (101,104),(101,105),(101,107),(104,105),(104,107),(105,107)，两个一组计数各加1。
          <br/>
          3) 把所有用户的计算结果求和，生成一个三角矩阵，再补全三角矩阵，就建立了物品的同现矩阵。
         </p>
         <p>
          如下面矩阵所示：
         </p>
         <pre><code>
      [101] [102] [103] [104] [105] [106] [107]
[101]   5     3     4     4     2     2     1
[102]   3     3     3     2     1     1     0
[103]   4     3     4     3     1     2     0
[104]   4     2     3     4     2     2     1
[105]   2     1     1     2     2     1     1
[106]   2     1     2     2     1     2     0
[107]   1     0     0     1     1     0     1
</code></pre>
         <p>
          2. 建立用户对物品的评分矩阵
         </p>
         <p>
          按用户分组，找到每个用户所选的物品及评分
         </p>
         <p>
          例如：用户ID为3的用户，分别给(3,101,2.0),(3,104,4.0),(3,105,4.5),(3,107,5.0)，这4个物品打分。
          <br/>
          1) 找到物品评分(3,101,2.0),(3,104,4.0),(3,105,4.5),(3,107,5.0)
          <br/>
          2) 建立用户对物品的评分矩阵
         </p>
         <pre><code>
       U3
[101] 2.0
[102] 0.0
[103] 0.0
[104] 4.0
[105] 4.5
[106] 0.0
[107] 5.0
</code></pre>
         <p>
          3. 矩阵计算推荐结果
         </p>
         <p>
          同现矩阵*评分矩阵=推荐结果
         </p>
         <p style="text-align: center">
          <a href="http://cos.name/wp-content/uploads/2013/04/alogrithm_1.jpg">
           <img src="http://cos.name/wp-content/uploads/2013/04/alogrithm_1-300x103.jpg"/>
          </a>
         </p>
         <p>
          图片摘自”Mahout In Action”
         </p>
         <p>
          推荐给用户ID为3的用户的结果是(103,24.5),(102,18.5),(106,16.5)
         </p>
         <p>
          <strong>
           代码部分：
          </strong>
         </p>
         <pre><code>
#引用plyr包
library(plyr)

#读取数据集
train&lt;-read.csv(file="small.csv",header=FALSE)
names(train)&lt;-c("user","item","pref") 

&gt; train
  user item pref
1 1 101 5.0
2 1 102 3.0
3 1 103 2.5
4 2 101 2.0
5 2 102 2.5
6 2 103 5.0
7 2 104 2.0
8 3 101 2.0
9 3 104 4.0
10 3 105 4.5
11 3 107 5.0
12 4 101 5.0
13 4 103 3.0
14 4 104 4.5
15 4 106 4.0
16 5 101 4.0
17 5 102 3.0
18 5 103 2.0
19 5 104 4.0
20 5 105 3.5
21 5 106 4.0

#计算用户列表
usersUnique&lt;-function(){
  users&lt;-unique(train$user)
  users[order(users)]
}

#计算商品列表方法
itemsUnique&lt;-function(){
  items&lt;-unique(train$item)
  items[order(items)]
}

# 用户列表
users&lt;-usersUnique() 
&gt; users
[1] 1 2 3 4 5

# 商品列表
items&lt;-itemsUnique() 
&gt; items
[1] 101 102 103 104 105 106 107

#建立商品列表索引
index&lt;-function(x) which(items %in% x)
data&lt;-ddply(train,.(user,item,pref),summarize,idx=index(item)) 

&gt; data
 user item pref idx
1 1 101 5.0 1
2 1 102 3.0 2
3 1 103 2.5 3
4 2 101 2.0 1
5 2 102 2.5 2
6 2 103 5.0 3
7 2 104 2.0 4
8 3 101 2.0 1
9 3 104 4.0 4
10 3 105 4.5 5
11 3 107 5.0 7
12 4 101 5.0 1
13 4 103 3.0 3
14 4 104 4.5 4
15 4 106 4.0 6
16 5 101 4.0 1
17 5 102 3.0 2
18 5 103 2.0 3
19 5 104 4.0 4
20 5 105 3.5 5
21 5 106 4.0 6

#同现矩阵
cooccurrence&lt;-function(data){
  n&lt;-length(items)
  co&lt;-matrix(rep(0,n*n),nrow=n)
  for(u in users){
    idx&lt;-index(data$item[which(data$user==u)])
    m&lt;-merge(idx,idx)
    for(i in 1:nrow(m)){
      co[m$x[i],m$y[i]]=co[m$x[i],m$y[i]]+1
    }
  }
  return(co)
}

#推荐算法
recommend&lt;-function(udata=udata,co=coMatrix,num=0){
  n&lt;-length(items)

  # all of pref
  pref&lt;-rep(0,n)
  pref[udata$idx]&lt;-udata$pref

  # 用户评分矩阵
  userx&lt;-matrix(pref,nrow=n)

  # 同现矩阵*评分矩阵
  r&lt;-co %*% userx

  # 推荐结果排序
  r[udata$idx]&lt;-0
  idx&lt;-order(r,decreasing=TRUE)
  topn&lt;-data.frame(user=rep(udata$user[1],length(idx)),item=items[idx],val=r[idx])
  topn0),]

  # 推荐结果取前num个
  if(num&gt;0){
    topn&lt;-head(topn,num)
  }

  #返回结果
  return(topn)
}

#生成同现矩阵
co&lt;-cooccurrence(data) 
&gt; co
    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]  5    3    4    4    2    2    1
[2,]  3    3    3    2    1    1    0
[3,]  4    3    4    3    1    2    0
[4,]  4    2    3    4    2    2    1
[5,]  2    1    1    2    2    1    1
[6,]  2    1    2    2    1    2    0
[7,]  1    0    0    1    1    0    1

#计算推荐结果
recommendation&lt;-data.frame()
for(i in 1:length(users)){
  udata&lt;-data[which(data$user==users[i]),]
  recommendation&lt;-rbind(recommendation,recommend(udata,co,0)) 
} 

&gt; recommendation
  user item val
1 1 104 33.5
2 1 106 18.0
3 1 105 15.5
4 1 107 5.0
5 2 106 20.5
6 2 105 15.5
7 2 107 4.0
8 3 103 24.5
9 3 102 18.5
10 3 106 16.5
11 4 102 37.0
12 4 105 26.0
13 4 107 9.5
14 5 107 11.5
</code></pre>
         <h2>
          3. R基于Hadoop分步式程序实现
         </h2>
         <p>
          R语言实现的MapReduce算法，可以基于R的数据对象实现，不必如JAVA一样使用文本存储。
         </p>
         <p>
          算法思想同上面R语言实现思想，略有复杂。
         </p>
         <p>
          算法的思想：
          <br/>
          1. 建立物品的同现矩阵
          <br/>
          1) 按用户分组，得到所有物品出现的组合列表。
          <br/>
          2) 对物品组合列表进行计数，建立物品的同现矩阵
          <br/>
          2. 建立用户对物品的评分矩阵
          <br/>
          3. 合并同现矩阵和评分矩阵
          <br/>
          4. 计算推荐结果列表
          <br/>
          5. 按输入格式得到推荐评分列表
         </p>
         <p>
          通过MapReduce实现时，所有操作都要使用Map和Reduce的任务完成，程序实现过程略有变化。
         </p>
         <p style="text-align: center">
          <a href="http://cos.name/wp-content/uploads/2013/04/aglorithm_2.jpg">
           <img src="http://cos.name/wp-content/uploads/2013/04/aglorithm_2-300x257.jpg"/>
          </a>
         </p>
         <p>
          图片摘自”Mahout In Action”
         </p>
         <h4>
          <strong>
           文字说明部分：
          </strong>
         </h4>
         <p>
          1. 建立物品的同现矩阵
         </p>
         <p>
          1) 按用户分组，得到所有物品出现的组合列表。
         </p>
         <p>
          key:物品列表向量
          <br/>
          val:物品组合向量
         </p>
         <pre><code>
$key
[1] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 102 102 102 102
[20] 102 102 102 103 103 103 103 103 103 103 103 103 103 103 104 104 104 104 104
[39] 104 104 104 104 104 104 104 105 105 105 105 106 106 106 106 107 107 107 107
[58] 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103 104
[77] 104 104 104 104 104 105 105 105 105 105 105 106 106 106 106 106 106

$val
[1] 101 102 103 101 102 103 104 101 104 105 107 101 103 104 106 101 102 103 101
[20] 102 103 104 101 102 103 101 102 103 104 101 103 104 106 101 102 103 104 101
[39] 104 105 107 101 103 104 106 101 104 105 107 101 103 104 106 101 104 105 107
[58] 101 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106 101
[77] 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106
</code></pre>
         <p>
          2) 对物品组合列表进行计数，建立物品的同现矩阵
         </p>
         <p>
          key:物品列表向量
          <br/>
          val:同现矩阵的数据框值(item,item,Freq)
          <br/>
          矩阵格式，要与”2. 建立用户对物品的评分矩阵”的格式一致，把异构的两种数据源，合并为同一种数据格式，为”3. 合并 同现矩阵 和 评分矩阵”做数据基础。
         </p>
         <pre><code>
$key
[1] 101 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103
[20] 104 104 104 104 104 104 104 105 105 105 105 105 105 105 106 106 106 106 106
[39] 106 107 107 107 107

$val
k v freq
1 101 101 5
2 101 102 3
3 101 103 4
4 101 104 4
5 101 105 2
6 101 106 2
7 101 107 1
8 102 101 3
9 102 102 3
10 102 103 3
11 102 104 2
12 102 105 1
13 102 106 1
14 103 101 4
15 103 102 3
16 103 103 4
17 103 104 3
18 103 105 1
19 103 106 2
20 104 101 4
21 104 102 2
22 104 103 3
23 104 104 4
24 104 105 2
25 104 106 2
26 104 107 1
27 105 101 2
28 105 102 1
29 105 103 1
30 105 104 2
31 105 105 2
32 105 106 1
33 105 107 1
34 106 101 2
35 106 102 1
36 106 103 2
37 106 104 2
38 106 105 1
39 106 106 2
40 107 101 1
41 107 104 1
42 107 105 1
43 107 107 1
</code></pre>
         <p>
          2. 建立用户对物品的评分矩阵
         </p>
         <p>
          key:物品列表
          <br/>
          val:用户对物品打分矩阵
          <br/>
          矩阵格式，要与”2) 对物品组合列表进行计数，建立物品的同现矩阵”的格式一致，把异构的两种数据源，合并为同一种数据格式，为”3. 合并 同现矩阵 和 评分矩阵”做数据基础
         </p>
         <pre><code>
$key
[1] 101 101 101 101 101 102 102 102 103 103 103 103 104 104 104 104 105 105 106
[20] 106 107

$val
item user pref
1 101 1 5.0
2 101 2 2.0
3 101 3 2.0
4 101 4 5.0
5 101 5 4.0
6 102 1 3.0
7 102 2 2.5
8 102 5 3.0
9 103 1 2.5
10 103 2 5.0
11 103 4 3.0
12 103 5 2.0
13 104 2 2.0
14 104 3 4.0
15 104 4 4.5
16 104 5 4.0
17 105 3 4.5
18 105 5 3.5
19 106 4 4.0
20 106 5 4.0
21 107 3 5.0
</code></pre>
         <p>
          3. 合并 同现矩阵 和 评分矩阵
         </p>
         <p>
          这一步操作是MapReduce比较特殊的，因为数据源是两个异构数据源，进行MapReduce的操作。
          <br/>
          在之前，我们已经把两种格式合并为一样的。使用equijoin这个rmr2包的函数，进行矩阵合并。
          <br/>
          key:NULL
          <br/>
          val:合并的数据框
         </p>
         <pre><code>
$key
NULL

$val
k.l v.l freq.l item.r user.r pref.r
1 103 101 4 103 1 2.5
2 103 102 3 103 1 2.5
3 103 103 4 103 1 2.5
4 103 104 3 103 1 2.5
5 103 105 1 103 1 2.5
6 103 106 2 103 1 2.5
7 103 101 4 103 2 5.0
8 103 102 3 103 2 5.0
9 103 103 4 103 2 5.0
10 103 104 3 103 2 5.0
11 103 105 1 103 2 5.0
12 103 106 2 103 2 5.0
13 103 101 4 103 4 3.0
....
</code></pre>
         <p>
          4. 计算推荐结果列表
         </p>
         <p>
          把第三步中的矩阵，进行合并计算，得到推荐结果列表
          <br/>
          key:物品列表
          <br/>
          val:推荐结果数据框
         </p>
         <pre><code>
$key
[1] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101
[19] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 102
[37] 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 103
[55] 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103
[73] 103 103 103 103 103 104 104 104 104 104 104 104 104 104 104 104 104 104
[91] 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 105 105 105
[109] 105 105 105 105 105 105 105 105 105 105 105 106 106 106 106 106 106 106
[127] 106 106 106 106 106 107 107 107 107

$val
k.l v.l user.r v
1 101 101 1 25.0
2 101 101 2 10.0
3 101 101 3 10.0
4 101 101 4 25.0
5 101 101 5 20.0
6 101 102 1 15.0
7 101 102 2 6.0
8 101 102 3 6.0
9 101 102 4 15.0
10 101 102 5 12.0
11 101 103 1 20.0
12 101 103 2 8.0
13 101 103 3 8.0
14 101 103 4 20.0
15 101 103 5 16.0
16 101 104 1 20.0
17 101 104 2 8.0
18 101 104 3 8.0
....
</code></pre>
         <p>
          5. 按输入格式得到推荐评分列表
         </p>
         <p>
          对推荐结果列表，进行排序处理，输出排序后的推荐结果。
          <br/>
          key:用户ID
          <br/>
          val:推荐结果数据框
         </p>
         <pre><code>
$key
[1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5

$val
user item pref
1 1 101 44.0
2 1 103 39.0
3 1 104 33.5
4 1 102 31.5
5 1 106 18.0
6 1 105 15.5
7 1 107 5.0
8 2 101 45.5
9 2 103 41.5
10 2 104 36.0
11 2 102 32.5
12 2 106 20.5
13 2 105 15.5
14 2 107 4.0
15 3 101 40.0
16 3 104 38.0
17 3 105 26.0
18 3 103 24.5
19 3 102 18.5
20 3 106 16.5
21 3 107 15.5
22 4 101 63.0
23 4 104 55.0
24 4 103 53.5
25 4 102 37.0
26 4 106 33.0
27 4 105 26.0
28 4 107 9.5
29 5 101 68.0
30 5 104 59.0
31 5 103 56.5
32 5 102 42.5
33 5 106 34.5
34 5 105 32.0
35 5 107 11.5
</code></pre>
         <p>
          <strong>
           rmr2使用提示：
          </strong>
         </p>
         <p>
          1) rmr.options(backend = ‘hadoop’)
         </p>
         <p>
          这里backend有两个值，hadoop,local。hadoop是默认值，使用hadoop环境运行程序。local是一个本地测试的设置，已经不建议再使用。我在开发时，试过local设置，运行速度非常快，模拟了hadoop的运行环境。但是，local模式下的代码，不能和hadoop模式下完全兼容，变动也比较大，因此不建议大家使用。
         </p>
         <p>
          2) equijoin(…,outer=c(‘left’))
         </p>
         <p>
          这里outer包括了4个值，c(“”, “left”, “right”, “full”)，非常像数据库中两个表的join操作
         </p>
         <p>
          3) keyval(k,v)
         </p>
         <p>
          mapReduce的操作，需要key和valve保存数据。如果直接输出，或者输出的未加key，会有一个警告Converting to.dfs argument to keyval with a NULL key。再上一篇文章中，rmr2的例子中就有类似的情况，请大家注意修改代码。
         </p>
         <pre><code>
&gt; to.dfs(1:10)

Warning message:
In to.dfs(1:10) : Converting to.dfs argument to keyval with a NULL key
</code></pre>
         <h4>
          <strong>
           代码部分：
          </strong>
         </h4>
         <pre><code>#加载rmr2包
library(rmr2)

#输入数据文件
train&lt;-read.csv(file="small.csv",header=FALSE)
names(train)&lt;-c("user","item","pref")

#使用rmr的hadoop格式，hadoop是默认设置。
rmr.options(backend = 'hadoop')

#把数据集存入HDFS
train.hdfs = to.dfs(keyval(train$user,train))
from.dfs(train.hdfs)

&gt; from.dfs(train.hdfs)

    13/04/07 14:35:44 INFO util.NativeCodeLoader: Loaded the native-hadoop library
    13/04/07 14:35:44 INFO zlib.ZlibFactory: Successfully loaded &amp; initialized native-zlib library
    13/04/07 14:35:44 INFO compress.CodecPool: Got brand-new decompressor
    $key
     [1] 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 5 5

    $val
       user item pref
    1     1  101  5.0
    2     1  102  3.0
    3     1  103  2.5
    4     2  101  2.0
    5     2  102  2.5
    6     2  103  5.0
    7     2  104  2.0
    8     3  101  2.0
    9     3  104  4.0
    10    3  105  4.5
    11    3  107  5.0
    12    4  101  5.0
    13    4  103  3.0
    14    4  104  4.5
    15    4  106  4.0
    16    5  101  4.0
    17    5  102  3.0
    18    5  103  2.0
    19    5  104  4.0
    20    5  105  3.5
    21    5  106  4.0

#STEP 1, 建立物品的同现矩阵
# 1) 按用户分组，得到所有物品出现的组合列表。
train.mr&lt;-mapreduce(
  train.hdfs, 
  map = function(k, v) {
    keyval(k,v$item)
  }
  ,reduce=function(k,v){
    m&lt;-merge(v,v)
    keyval(m$x,m$y)
  }
)

from.dfs(train.mr)

    $key
     [1] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 102 102 102 102
    [20] 102 102 102 103 103 103 103 103 103 103 103 103 103 103 104 104 104 104 104
    [39] 104 104 104 104 104 104 104 105 105 105 105 106 106 106 106 107 107 107 107
    [58] 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103 104
    [77] 104 104 104 104 104 105 105 105 105 105 105 106 106 106 106 106 106

    $val
     [1] 101 102 103 101 102 103 104 101 104 105 107 101 103 104 106 101 102 103 101
    [20] 102 103 104 101 102 103 101 102 103 104 101 103 104 106 101 102 103 104 101
    [39] 104 105 107 101 103 104 106 101 104 105 107 101 103 104 106 101 104 105 107
    [58] 101 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106 101
    [77] 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106

# 2) 对物品组合列表进行计数，建立物品的同现矩阵
step2.mr&lt;-mapreduce(
  train.mr,
  map = function(k, v) {
    d&lt;-data.frame(k,v)
    d2&lt;-ddply(d,.(k,v),count)

    key&lt;-d2$k
    val&lt;-d2
    keyval(key,val)
  }
)
from.dfs(step2.mr)

    $key
     [1] 101 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103
    [20] 104 104 104 104 104 104 104 105 105 105 105 105 105 105 106 106 106 106 106
    [39] 106 107 107 107 107

    $val
         k   v freq
    1  101 101    5
    2  101 102    3
    3  101 103    4
    4  101 104    4
    5  101 105    2
    6  101 106    2
    7  101 107    1
    8  102 101    3
    9  102 102    3
    10 102 103    3
    11 102 104    2
    12 102 105    1
    13 102 106    1
    14 103 101    4
    15 103 102    3
    16 103 103    4
    17 103 104    3
    18 103 105    1
    19 103 106    2
    20 104 101    4
    21 104 102    2
    22 104 103    3
    23 104 104    4
    24 104 105    2
    25 104 106    2
    26 104 107    1
    27 105 101    2
    28 105 102    1
    29 105 103    1
    30 105 104    2
    31 105 105    2
    32 105 106    1
    33 105 107    1
    34 106 101    2
    35 106 102    1
    36 106 103    2
    37 106 104    2
    38 106 105    1
    39 106 106    2
    40 107 101    1
    41 107 104    1
    42 107 105    1
    43 107 107    1    

# 2. 建立用户对物品的评分矩阵

train2.mr&lt;-mapreduce(
  train.hdfs, 
  map = function(k, v) {
    #df&lt;-v[which(v$user==3),]
    df&lt;-v
    key&lt;-df$item
    val&lt;-data.frame(item=df$item,user=df$user,pref=df$pref)
    keyval(key,val)
  }
)
from.dfs(train2.mr)

    $key
     [1] 101 101 101 101 101 102 102 102 103 103 103 103 104 104 104 104 105 105 106
    [20] 106 107

    $val
       item user pref
    1   101    1  5.0
    2   101    2  2.0
    3   101    3  2.0
    4   101    4  5.0
    5   101    5  4.0
    6   102    1  3.0
    7   102    2  2.5
    8   102    5  3.0
    9   103    1  2.5
    10  103    2  5.0
    11  103    4  3.0
    12  103    5  2.0
    13  104    2  2.0
    14  104    3  4.0
    15  104    4  4.5
    16  104    5  4.0
    17  105    3  4.5
    18  105    5  3.5
    19  106    4  4.0
    20  106    5  4.0
    21  107    3  5.0

#3. 合并同现矩阵 和 评分矩阵
eq.hdfs&lt;-equijoin(
  left.input=step2.mr, 
  right.input=train2.mr,
  map.left=function(k,v){
    keyval(k,v)
  },
  map.right=function(k,v){
    keyval(k,v)
  },
  outer = c("left")
)
from.dfs(eq.hdfs)

    $key
    NULL

    $val
        k.l v.l freq.l item.r user.r pref.r
    1   103 101      4    103      1    2.5
    2   103 102      3    103      1    2.5
    3   103 103      4    103      1    2.5
    4   103 104      3    103      1    2.5
    5   103 105      1    103      1    2.5
    6   103 106      2    103      1    2.5
    7   103 101      4    103      2    5.0
    8   103 102      3    103      2    5.0
    9   103 103      4    103      2    5.0
    10  103 104      3    103      2    5.0
    11  103 105      1    103      2    5.0
    12  103 106      2    103      2    5.0
    13  103 101      4    103      4    3.0
    14  103 102      3    103      4    3.0
    15  103 103      4    103      4    3.0
    16  103 104      3    103      4    3.0
    17  103 105      1    103      4    3.0
    18  103 106      2    103      4    3.0
    19  103 101      4    103      5    2.0
    20  103 102      3    103      5    2.0
    21  103 103      4    103      5    2.0
    22  103 104      3    103      5    2.0
    23  103 105      1    103      5    2.0
    24  103 106      2    103      5    2.0
    25  101 101      5    101      1    5.0
    26  101 102      3    101      1    5.0
    27  101 103      4    101      1    5.0
    28  101 104      4    101      1    5.0
    29  101 105      2    101      1    5.0
    30  101 106      2    101      1    5.0
    31  101 107      1    101      1    5.0
    32  101 101      5    101      2    2.0
    33  101 102      3    101      2    2.0
    34  101 103      4    101      2    2.0
    35  101 104      4    101      2    2.0
    36  101 105      2    101      2    2.0
    37  101 106      2    101      2    2.0
    38  101 107      1    101      2    2.0
    39  101 101      5    101      3    2.0
    40  101 102      3    101      3    2.0
    41  101 103      4    101      3    2.0
    42  101 104      4    101      3    2.0
    43  101 105      2    101      3    2.0
    44  101 106      2    101      3    2.0
    45  101 107      1    101      3    2.0
    46  101 101      5    101      4    5.0
    47  101 102      3    101      4    5.0
    48  101 103      4    101      4    5.0
    49  101 104      4    101      4    5.0
    50  101 105      2    101      4    5.0
    51  101 106      2    101      4    5.0
    52  101 107      1    101      4    5.0
    53  101 101      5    101      5    4.0
    54  101 102      3    101      5    4.0
    55  101 103      4    101      5    4.0
    56  101 104      4    101      5    4.0
    57  101 105      2    101      5    4.0
    58  101 106      2    101      5    4.0
    59  101 107      1    101      5    4.0
    60  105 101      2    105      3    4.5
    61  105 102      1    105      3    4.5
    62  105 103      1    105      3    4.5
    63  105 104      2    105      3    4.5
    64  105 105      2    105      3    4.5
    65  105 106      1    105      3    4.5
    66  105 107      1    105      3    4.5
    67  105 101      2    105      5    3.5
    68  105 102      1    105      5    3.5
    69  105 103      1    105      5    3.5
    70  105 104      2    105      5    3.5
    71  105 105      2    105      5    3.5
    72  105 106      1    105      5    3.5
    73  105 107      1    105      5    3.5
    74  106 101      2    106      4    4.0
    75  106 102      1    106      4    4.0
    76  106 103      2    106      4    4.0
    77  106 104      2    106      4    4.0
    78  106 105      1    106      4    4.0
    79  106 106      2    106      4    4.0
    80  106 101      2    106      5    4.0
    81  106 102      1    106      5    4.0
    82  106 103      2    106      5    4.0
    83  106 104      2    106      5    4.0
    84  106 105      1    106      5    4.0
    85  106 106      2    106      5    4.0
    86  104 101      4    104      2    2.0
    87  104 102      2    104      2    2.0
    88  104 103      3    104      2    2.0
    89  104 104      4    104      2    2.0
    90  104 105      2    104      2    2.0
    91  104 106      2    104      2    2.0
    92  104 107      1    104      2    2.0
    93  104 101      4    104      3    4.0
    94  104 102      2    104      3    4.0
    95  104 103      3    104      3    4.0
    96  104 104      4    104      3    4.0
    97  104 105      2    104      3    4.0
    98  104 106      2    104      3    4.0
    99  104 107      1    104      3    4.0
    100 104 101      4    104      4    4.5
    101 104 102      2    104      4    4.5
    102 104 103      3    104      4    4.5
    103 104 104      4    104      4    4.5
    104 104 105      2    104      4    4.5
    105 104 106      2    104      4    4.5
    106 104 107      1    104      4    4.5
    107 104 101      4    104      5    4.0
    108 104 102      2    104      5    4.0
    109 104 103      3    104      5    4.0
    110 104 104      4    104      5    4.0
    111 104 105      2    104      5    4.0
    112 104 106      2    104      5    4.0
    113 104 107      1    104      5    4.0
    114 102 101      3    102      1    3.0
    115 102 102      3    102      1    3.0
    116 102 103      3    102      1    3.0
    117 102 104      2    102      1    3.0
    118 102 105      1    102      1    3.0
    119 102 106      1    102      1    3.0
    120 102 101      3    102      2    2.5
    121 102 102      3    102      2    2.5
    122 102 103      3    102      2    2.5
    123 102 104      2    102      2    2.5
    124 102 105      1    102      2    2.5
    125 102 106      1    102      2    2.5
    126 102 101      3    102      5    3.0
    127 102 102      3    102      5    3.0
    128 102 103      3    102      5    3.0
    129 102 104      2    102      5    3.0
    130 102 105      1    102      5    3.0
    131 102 106      1    102      5    3.0
    132 107 101      1    107      3    5.0
    133 107 104      1    107      3    5.0
    134 107 105      1    107      3    5.0
    135 107 107      1    107      3    5.0

#4. 计算推荐结果列表
cal.mr&lt;-mapreduce(
  input=eq.hdfs,
  map=function(k,v){
    val&lt;-v
    na&lt;-is.na(v$user.r)
    if(length(which(na))&gt;0) val&lt;-v[-which(is.na(v$user.r)),]
    keyval(val$k.l,val)
  }
  ,reduce=function(k,v){
    val&lt;-ddply(v,.(k.l,v.l,user.r),summarize,v=freq.l*pref.r)
    keyval(val$k.l,val)
  }
)
from.dfs(cal.mr)

    $key
      [1] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101
     [19] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 102
     [37] 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 103
     [55] 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103
     [73] 103 103 103 103 103 104 104 104 104 104 104 104 104 104 104 104 104 104
     [91] 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 105 105 105
    [109] 105 105 105 105 105 105 105 105 105 105 105 106 106 106 106 106 106 106
    [127] 106 106 106 106 106 107 107 107 107

    $val
        k.l v.l user.r    v
    1   101 101      1 25.0
    2   101 101      2 10.0
    3   101 101      3 10.0
    4   101 101      4 25.0
    5   101 101      5 20.0
    6   101 102      1 15.0
    7   101 102      2  6.0
    8   101 102      3  6.0
    9   101 102      4 15.0
    10  101 102      5 12.0
    11  101 103      1 20.0
    12  101 103      2  8.0
    13  101 103      3  8.0
    14  101 103      4 20.0
    15  101 103      5 16.0
    16  101 104      1 20.0
    17  101 104      2  8.0
    18  101 104      3  8.0
    19  101 104      4 20.0
    20  101 104      5 16.0
    21  101 105      1 10.0
    22  101 105      2  4.0
    23  101 105      3  4.0
    24  101 105      4 10.0
    25  101 105      5  8.0
    26  101 106      1 10.0
    27  101 106      2  4.0
    28  101 106      3  4.0
    29  101 106      4 10.0
    30  101 106      5  8.0
    31  101 107      1  5.0
    32  101 107      2  2.0
    33  101 107      3  2.0
    34  101 107      4  5.0
    35  101 107      5  4.0
    36  102 101      1  9.0
    37  102 101      2  7.5
    38  102 101      5  9.0
    39  102 102      1  9.0
    40  102 102      2  7.5
    41  102 102      5  9.0
    42  102 103      1  9.0
    43  102 103      2  7.5
    44  102 103      5  9.0
    45  102 104      1  6.0
    46  102 104      2  5.0
    47  102 104      5  6.0
    48  102 105      1  3.0
    49  102 105      2  2.5
    50  102 105      5  3.0
    51  102 106      1  3.0
    52  102 106      2  2.5
    53  102 106      5  3.0
    54  103 101      1 10.0
    55  103 101      2 20.0
    56  103 101      4 12.0
    57  103 101      5  8.0
    58  103 102      1  7.5
    59  103 102      2 15.0
    60  103 102      4  9.0
    61  103 102      5  6.0
    62  103 103      1 10.0
    63  103 103      2 20.0
    64  103 103      4 12.0
    65  103 103      5  8.0
    66  103 104      1  7.5
    67  103 104      2 15.0
    68  103 104      4  9.0
    69  103 104      5  6.0
    70  103 105      1  2.5
    71  103 105      2  5.0
    72  103 105      4  3.0
    73  103 105      5  2.0
    74  103 106      1  5.0
    75  103 106      2 10.0
    76  103 106      4  6.0
    77  103 106      5  4.0
    78  104 101      2  8.0
    79  104 101      3 16.0
    80  104 101      4 18.0
    81  104 101      5 16.0
    82  104 102      2  4.0
    83  104 102      3  8.0
    84  104 102      4  9.0
    85  104 102      5  8.0
    86  104 103      2  6.0
    87  104 103      3 12.0
    88  104 103      4 13.5
    89  104 103      5 12.0
    90  104 104      2  8.0
    91  104 104      3 16.0
    92  104 104      4 18.0
    93  104 104      5 16.0
    94  104 105      2  4.0
    95  104 105      3  8.0
    96  104 105      4  9.0
    97  104 105      5  8.0
    98  104 106      2  4.0
    99  104 106      3  8.0
    100 104 106      4  9.0
    101 104 106      5  8.0
    102 104 107      2  2.0
    103 104 107      3  4.0
    104 104 107      4  4.5
    105 104 107      5  4.0
    106 105 101      3  9.0
    107 105 101      5  7.0
    108 105 102      3  4.5
    109 105 102      5  3.5
    110 105 103      3  4.5
    111 105 103      5  3.5
    112 105 104      3  9.0
    113 105 104      5  7.0
    114 105 105      3  9.0
    115 105 105      5  7.0
    116 105 106      3  4.5
    117 105 106      5  3.5
    118 105 107      3  4.5
    119 105 107      5  3.5
    120 106 101      4  8.0
    121 106 101      5  8.0
    122 106 102      4  4.0
    123 106 102      5  4.0
    124 106 103      4  8.0
    125 106 103      5  8.0
    126 106 104      4  8.0
    127 106 104      5  8.0
    128 106 105      4  4.0
    129 106 105      5  4.0
    130 106 106      4  8.0
    131 106 106      5  8.0
    132 107 101      3  5.0
    133 107 104      3  5.0
    134 107 105      3  5.0
    135 107 107      3  5.0

#5. 按输入格式得到推荐评分列表
result.mr&lt;-mapreduce(
  input=cal.mr,
  map=function(k,v){
    keyval(v$user.r,v)
  }
  ,reduce=function(k,v){
    val&lt;-ddply(v,.(user.r,v.l),summarize,v=sum(v))
    val2&lt;-val[order(val$v,decreasing=TRUE),]
    names(val2)&lt;-c("user","item","pref")
    keyval(val2$user,val2)
  }
)
from.dfs(result.mr)

    $key
     [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5

    $val
       user item pref
    1     1  101 44.0
    2     1  103 39.0
    3     1  104 33.5
    4     1  102 31.5
    5     1  106 18.0
    6     1  105 15.5
    7     1  107  5.0
    8     2  101 45.5
    9     2  103 41.5
    10    2  104 36.0
    11    2  102 32.5
    12    2  106 20.5
    13    2  105 15.5
    14    2  107  4.0
    15    3  101 40.0
    16    3  104 38.0
    17    3  105 26.0
    18    3  103 24.5
    19    3  102 18.5
    20    3  106 16.5
    21    3  107 15.5
    22    4  101 63.0
    23    4  104 55.0
    24    4  103 53.5
    25    4  102 37.0
    26    4  106 33.0
    27    4  105 26.0
    28    4  107  9.5
    29    5  101 68.0
    30    5  104 59.0
    31    5  103 56.5
    32    5  102 42.5
    33    5  106 34.5
    34    5  105 32.0
    35    5  107 11.5
</code></pre>
         <h4>
          文章中提供了R用MapReduce方法，实现协同过滤算法的一种思路。
         </h4>
         <p>
          算法可能不是最优的，希望大家有时间写出更好的算法来！随着R语言及Hadoop的发展，相信会有越来越多的算法应用会使用这种方式！
          <br/>
          如有问题请给我留言，我很高兴与大家讨论。
         </p>
         <p>
          <span style="color: #000000;font-family: 'DejaVu Sans Mono', 'Droid Sans Mono', 'Lucida Console', Consolas, Monaco, monospace;font-size: 12px;font-style: normal;line-height: normal;background-color: #ffffff">
          </span>
         </p>
         <div class="wumii-hook">
          <br/>
          <br/>
         </div>
        </div>
        <!-- .entry-content -->
        <footer class="entry-meta">
        </footer>
        <!-- .entry-meta -->
       </article>
       <!-- #post -->
       <nav class="navigation post-navigation" role="navigation">
        <h1 class="screen-reader-text">
         文章导航
        </h1>
        <div class="nav-links">
         <a href="http://cos.name/2013/04/human-eye-vs-machine-learning/" rel="prev">
          <span class="meta-nav">
           ←
          </span>
          COS每周精选:群众智慧vs机器学习？
         </a>
         <a href="http://cos.name/2013/04/rhadoop4-rhbase/" rel="next">
          RHadoop实践系列之四 rhbase安装与使用
          <span class="meta-nav">
           →
          </span>
         </a>
        </div>
        <!-- .nav-links -->
       </nav>
       <!-- .navigation -->
       <div class="comments-area" id="comments">
        <h2 class="comments-title">
         《
         <span>
          RHadoop实践系列之三 R实现MapReduce的协同过滤算法
         </span>
         》有18个想法
        </h2>
        <ol class="comment-list">
         <li class="comment even thread-even depth-1 parent" id="comment-3949">
          <article class="comment-body" id="div-comment-3949">
           <footer class="comment-meta">
            <div class="comment-author vcard">
             <img src="http://sdn.geekzu.org/avatar/66aa115466aeedf71937ff80c00b7982?s=74&amp;d=monsterid&amp;r=g"/>
             <b class="fn">
              <a class="url" href="http://www.road2stat.com/" rel="external nofollow">
               Xiao Nan
              </a>
             </b>
             <span class="says">
              说道：
             </span>
            </div>
            <!-- .comment-author -->
            <div class="comment-metadata">
             <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-3949">
              <time datetime="2013-04-10T00:07:45+00:00">
               2013/04/10 00:07
              </time>
             </a>
            </div>
            <!-- .comment-metadata -->
           </footer>
           <!-- .comment-meta -->
           <div class="comment-content">
            <p>
             好文。
            </p>
            <p>
             实现推荐算法时，通常感觉 which() 这一步是最慢的，有没有优化的空间呢？试了很多其他方式，效果都不好。
            </p>
           </div>
           <!-- .comment-content -->
           <div class="reply">
            <a aria-label="回复给Xiao Nan" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=3949#respond" onclick='return addComment.moveForm( "div-comment-3949", "3949", "respond", "7619" )' rel="nofollow">
             回复
            </a>
           </div>
          </article>
          <!-- .comment-body -->
          <ol class="children">
           <li class="comment byuser comment-author-conan bypostauthor odd alt depth-2 parent" id="comment-3956">
            <article class="comment-body" id="div-comment-3956">
             <footer class="comment-meta">
              <div class="comment-author vcard">
               <img src="http://sdn.geekzu.org/avatar/732c1985d0f02cef1d2c69df55aca7d0?s=74&amp;d=monsterid&amp;r=g"/>
               <b class="fn">
                张 丹
               </b>
               <span class="says">
                说道：
               </span>
              </div>
              <!-- .comment-author -->
              <div class="comment-metadata">
               <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-3956">
                <time datetime="2013-04-10T09:42:44+00:00">
                 2013/04/10 09:42
                </time>
               </a>
              </div>
              <!-- .comment-metadata -->
             </footer>
             <!-- .comment-meta -->
             <div class="comment-content">
              <p>
               你用的是文章中的方法，还是自己实现的基于距离的算法？
               <br/>
               R本地实现，还是MapReduce实现？
              </p>
              <p>
               which的操作在哪一步？
               <br/>
               通过矩阵计算，可以省略一些可能用到which的地方。
              </p>
             </div>
             <!-- .comment-content -->
             <div class="reply">
              <a aria-label="回复给张 丹" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=3956#respond" onclick='return addComment.moveForm( "div-comment-3956", "3956", "respond", "7619" )' rel="nofollow">
               回复
              </a>
             </div>
            </article>
            <!-- .comment-body -->
            <ol class="children">
             <li class="comment even depth-3" id="comment-3957">
              <article class="comment-body" id="div-comment-3957">
               <footer class="comment-meta">
                <div class="comment-author vcard">
                 <img src="http://sdn.geekzu.org/avatar/c59ab94f48fe5be53279429cb584437f?s=74&amp;d=monsterid&amp;r=g"/>
                 <b class="fn">
                  michael_DYM
                 </b>
                 <span class="says">
                  说道：
                 </span>
                </div>
                <!-- .comment-author -->
                <div class="comment-metadata">
                 <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-3957">
                  <time datetime="2013-04-10T10:09:47+00:00">
                   2013/04/10 10:09
                  </time>
                 </a>
                </div>
                <!-- .comment-metadata -->
               </footer>
               <!-- .comment-meta -->
               <div class="comment-content">
                <p>
                 能演示一下直接读hadoop上的数据吗？而不是从本地读取之后再转化为hdfs的格式。
                </p>
               </div>
               <!-- .comment-content -->
              </article>
              <!-- .comment-body -->
             </li>
             <!-- #comment-## -->
            </ol>
            <!-- .children -->
           </li>
           <!-- #comment-## -->
          </ol>
          <!-- .children -->
         </li>
         <!-- #comment-## -->
         <li class="comment byuser comment-author-conan bypostauthor odd alt thread-odd thread-alt depth-1" id="comment-3958">
          <article class="comment-body" id="div-comment-3958">
           <footer class="comment-meta">
            <div class="comment-author vcard">
             <img src="http://sdn.geekzu.org/avatar/732c1985d0f02cef1d2c69df55aca7d0?s=74&amp;d=monsterid&amp;r=g"/>
             <b class="fn">
              张 丹
             </b>
             <span class="says">
              说道：
             </span>
            </div>
            <!-- .comment-author -->
            <div class="comment-metadata">
             <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-3958">
              <time datetime="2013-04-10T10:21:10+00:00">
               2013/04/10 10:21
              </time>
             </a>
            </div>
            <!-- .comment-metadata -->
           </footer>
           <!-- .comment-meta -->
           <div class="comment-content">
            <p>
             hi @michael_DYM,
            </p>
            <p>
             直接读hadoop上的数据，可用from.dfs()函数。
             <br/>
             from.dfs(“/tmp/RtmpWnzxl4/file5deb791fcbd5”)
            </p>
            <p>
             参考前一篇文章：
             <br/>
             <a href="http://cos.name/2013/03/rhadoop2-rhadoop/" rel="nofollow">
              http://cos.name/2013/03/rhadoop2-rhadoop/
             </a>
            </p>
           </div>
           <!-- .comment-content -->
           <div class="reply">
            <a aria-label="回复给张 丹" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=3958#respond" onclick='return addComment.moveForm( "div-comment-3958", "3958", "respond", "7619" )' rel="nofollow">
             回复
            </a>
           </div>
          </article>
          <!-- .comment-body -->
         </li>
         <!-- #comment-## -->
         <li class="comment even thread-even depth-1 parent" id="comment-4002">
          <article class="comment-body" id="div-comment-4002">
           <footer class="comment-meta">
            <div class="comment-author vcard">
             <img src="http://sdn.geekzu.org/avatar/e787625af13288963c5a63bd2a4e5e82?s=74&amp;d=monsterid&amp;r=g"/>
             <b class="fn">
              <a class="url" href="http://gaotao.name/cn" rel="external nofollow">
               gaotao
              </a>
             </b>
             <span class="says">
              说道：
             </span>
            </div>
            <!-- .comment-author -->
            <div class="comment-metadata">
             <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4002">
              <time datetime="2013-04-15T19:54:48+00:00">
               2013/04/15 19:54
              </time>
             </a>
            </div>
            <!-- .comment-metadata -->
           </footer>
           <!-- .comment-meta -->
           <div class="comment-content">
            <p>
             STEP 1 #3  left.input=step2.mr is not found
            </p>
           </div>
           <!-- .comment-content -->
           <div class="reply">
            <a aria-label="回复给gaotao" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=4002#respond" onclick='return addComment.moveForm( "div-comment-4002", "4002", "respond", "7619" )' rel="nofollow">
             回复
            </a>
           </div>
          </article>
          <!-- .comment-body -->
          <ol class="children">
           <li class="comment byuser comment-author-conan bypostauthor odd alt depth-2" id="comment-4003">
            <article class="comment-body" id="div-comment-4003">
             <footer class="comment-meta">
              <div class="comment-author vcard">
               <img src="http://sdn.geekzu.org/avatar/732c1985d0f02cef1d2c69df55aca7d0?s=74&amp;d=monsterid&amp;r=g"/>
               <b class="fn">
                张 丹
               </b>
               <span class="says">
                说道：
               </span>
              </div>
              <!-- .comment-author -->
              <div class="comment-metadata">
               <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4003">
                <time datetime="2013-04-15T20:22:16+00:00">
                 2013/04/15 20:22
                </time>
               </a>
              </div>
              <!-- .comment-metadata -->
             </footer>
             <!-- .comment-meta -->
             <div class="comment-content">
              <p>
               好像是排版时丢了一些代码，我马上补上。
              </p>
             </div>
             <!-- .comment-content -->
             <div class="reply">
              <a aria-label="回复给张 丹" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=4003#respond" onclick='return addComment.moveForm( "div-comment-4003", "4003", "respond", "7619" )' rel="nofollow">
               回复
              </a>
             </div>
            </article>
            <!-- .comment-body -->
           </li>
           <!-- #comment-## -->
           <li class="comment byuser comment-author-conan bypostauthor even depth-2 parent" id="comment-4004">
            <article class="comment-body" id="div-comment-4004">
             <footer class="comment-meta">
              <div class="comment-author vcard">
               <img src="http://sdn.geekzu.org/avatar/732c1985d0f02cef1d2c69df55aca7d0?s=74&amp;d=monsterid&amp;r=g"/>
               <b class="fn">
                张 丹
               </b>
               <span class="says">
                说道：
               </span>
              </div>
              <!-- .comment-author -->
              <div class="comment-metadata">
               <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4004">
                <time datetime="2013-04-15T20:39:46+00:00">
                 2013/04/15 20:39
                </time>
               </a>
              </div>
              <!-- .comment-metadata -->
             </footer>
             <!-- .comment-meta -->
             <div class="comment-content">
              <p>
               已经修复，再试一下。
              </p>
             </div>
             <!-- .comment-content -->
             <div class="reply">
              <a aria-label="回复给张 丹" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=4004#respond" onclick='return addComment.moveForm( "div-comment-4004", "4004", "respond", "7619" )' rel="nofollow">
               回复
              </a>
             </div>
            </article>
            <!-- .comment-body -->
            <ol class="children">
             <li class="comment odd alt depth-3" id="comment-4006">
              <article class="comment-body" id="div-comment-4006">
               <footer class="comment-meta">
                <div class="comment-author vcard">
                 <img src="http://sdn.geekzu.org/avatar/e787625af13288963c5a63bd2a4e5e82?s=74&amp;d=monsterid&amp;r=g"/>
                 <b class="fn">
                  <a class="url" href="http://gaotao.name/cn" rel="external nofollow">
                   gaotao
                  </a>
                 </b>
                 <span class="says">
                  说道：
                 </span>
                </div>
                <!-- .comment-author -->
                <div class="comment-metadata">
                 <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4006">
                  <time datetime="2013-04-15T21:03:04+00:00">
                   2013/04/15 21:03
                  </time>
                 </a>
                </div>
                <!-- .comment-metadata -->
               </footer>
               <!-- .comment-meta -->
               <div class="comment-content">
                <p>
                 it’s OK now, thx
                </p>
               </div>
               <!-- .comment-content -->
              </article>
              <!-- .comment-body -->
             </li>
             <!-- #comment-## -->
            </ol>
            <!-- .children -->
           </li>
           <!-- #comment-## -->
          </ol>
          <!-- .children -->
         </li>
         <!-- #comment-## -->
         <li class="comment even thread-odd thread-alt depth-1 parent" id="comment-4226">
          <article class="comment-body" id="div-comment-4226">
           <footer class="comment-meta">
            <div class="comment-author vcard">
             <img src="http://sdn.geekzu.org/avatar/26e6e7d19166d4cca28708798ce95e89?s=74&amp;d=monsterid&amp;r=g"/>
             <b class="fn">
              <a class="url" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/" rel="external nofollow">
               bofengshuimen
              </a>
             </b>
             <span class="says">
              说道：
             </span>
            </div>
            <!-- .comment-author -->
            <div class="comment-metadata">
             <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4226">
              <time datetime="2013-05-18T21:36:04+00:00">
               2013/05/18 21:36
              </time>
             </a>
            </div>
            <!-- .comment-metadata -->
           </footer>
           <!-- .comment-meta -->
           <div class="comment-content">
            <p>
             运行2中计算推荐结果部分的代码时，出现：错误于head(topn, num) : 找不到对象’topn’的问题，请问这个是错在哪里？
            </p>
           </div>
           <!-- .comment-content -->
           <div class="reply">
            <a aria-label="回复给bofengshuimen" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=4226#respond" onclick='return addComment.moveForm( "div-comment-4226", "4226", "respond", "7619" )' rel="nofollow">
             回复
            </a>
           </div>
          </article>
          <!-- .comment-body -->
          <ol class="children">
           <li class="comment byuser comment-author-conan bypostauthor odd alt depth-2" id="comment-4232">
            <article class="comment-body" id="div-comment-4232">
             <footer class="comment-meta">
              <div class="comment-author vcard">
               <img src="http://sdn.geekzu.org/avatar/732c1985d0f02cef1d2c69df55aca7d0?s=74&amp;d=monsterid&amp;r=g"/>
               <b class="fn">
                张 丹
               </b>
               <span class="says">
                说道：
               </span>
              </div>
              <!-- .comment-author -->
              <div class="comment-metadata">
               <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4232">
                <time datetime="2013-05-20T15:34:54+00:00">
                 2013/05/20 15:34
                </time>
               </a>
              </div>
              <!-- .comment-metadata -->
             </footer>
             <!-- .comment-meta -->
             <div class="comment-content">
              <p>
               你好，非常感谢你的提问，请原谅我的疏忽，排版的时候，可能丢了一些代码。我已经补上了，请再试一下。
              </p>
             </div>
             <!-- .comment-content -->
             <div class="reply">
              <a aria-label="回复给张 丹" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=4232#respond" onclick='return addComment.moveForm( "div-comment-4232", "4232", "respond", "7619" )' rel="nofollow">
               回复
              </a>
             </div>
            </article>
            <!-- .comment-body -->
           </li>
           <!-- #comment-## -->
          </ol>
          <!-- .children -->
         </li>
         <!-- #comment-## -->
         <li class="comment even thread-even depth-1 parent" id="comment-4328">
          <article class="comment-body" id="div-comment-4328">
           <footer class="comment-meta">
            <div class="comment-author vcard">
             <img src="http://sdn.geekzu.org/avatar/87af08eea177e8bb8086ba112e5ef860?s=74&amp;d=monsterid&amp;r=g"/>
             <b class="fn">
              itisBI
             </b>
             <span class="says">
              说道：
             </span>
            </div>
            <!-- .comment-author -->
            <div class="comment-metadata">
             <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4328">
              <time datetime="2013-06-04T09:39:07+00:00">
               2013/06/04 09:39
              </time>
             </a>
            </div>
            <!-- .comment-metadata -->
           </footer>
           <!-- .comment-meta -->
           <div class="comment-content">
            <p>
             from.dfs(
             <br/>
             equijoin(left.input = to.dfs(keyval(1:11, 1:10)),
             <br/>
             right.input = to.dfs(keyval(1:10, 1:10^2)),
             <br/>
             map.left=function(k,v){
             <br/>
             keyval(k,v)
             <br/>
             },
             <br/>
             map.right=function(k,v){
             <br/>
             keyval(k,v)
             <br/>
             },
             <br/>
             outer = c(“full”)
             <br/>
             ))
            </p>
            <p>
             貌似有一个 Bug~    关于返回的是 NA 的处理上——有问题~ 请大牛帮忙讲解讲解！
            </p>
           </div>
           <!-- .comment-content -->
           <div class="reply">
            <a aria-label="回复给itisBI" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=4328#respond" onclick='return addComment.moveForm( "div-comment-4328", "4328", "respond", "7619" )' rel="nofollow">
             回复
            </a>
           </div>
          </article>
          <!-- .comment-body -->
          <ol class="children">
           <li class="comment byuser comment-author-conan bypostauthor odd alt depth-2" id="comment-4332">
            <article class="comment-body" id="div-comment-4332">
             <footer class="comment-meta">
              <div class="comment-author vcard">
               <img src="http://sdn.geekzu.org/avatar/732c1985d0f02cef1d2c69df55aca7d0?s=74&amp;d=monsterid&amp;r=g"/>
               <b class="fn">
                张 丹
               </b>
               <span class="says">
                说道：
               </span>
              </div>
              <!-- .comment-author -->
              <div class="comment-metadata">
               <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4332">
                <time datetime="2013-06-04T20:42:15+00:00">
                 2013/06/04 20:42
                </time>
               </a>
              </div>
              <!-- .comment-metadata -->
             </footer>
             <!-- .comment-meta -->
             <div class="comment-content">
              <p>
               NA的处理？是什么bug？
               <br/>
               你能把运行的日志，一起打印出来吗？
              </p>
             </div>
             <!-- .comment-content -->
             <div class="reply">
              <a aria-label="回复给张 丹" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=4332#respond" onclick='return addComment.moveForm( "div-comment-4332", "4332", "respond", "7619" )' rel="nofollow">
               回复
              </a>
             </div>
            </article>
            <!-- .comment-body -->
           </li>
           <!-- #comment-## -->
          </ol>
          <!-- .children -->
         </li>
         <!-- #comment-## -->
         <li class="comment even thread-odd thread-alt depth-1 parent" id="comment-4507">
          <article class="comment-body" id="div-comment-4507">
           <footer class="comment-meta">
            <div class="comment-author vcard">
             <img src="http://sdn.geekzu.org/avatar/1c23fdd490830be25fd822279f97e2ad?s=74&amp;d=monsterid&amp;r=g"/>
             <b class="fn">
              谢冰
             </b>
             <span class="says">
              说道：
             </span>
            </div>
            <!-- .comment-author -->
            <div class="comment-metadata">
             <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4507">
              <time datetime="2013-07-10T10:46:04+00:00">
               2013/07/10 10:46
              </time>
             </a>
            </div>
            <!-- .comment-metadata -->
           </footer>
           <!-- .comment-meta -->
           <div class="comment-content">
            <p>
             本地R语言实现代码中 这句总是报错
            </p>
            <p>
             topn&lt;-data.frame(user=rep(udata$user[1],length(idx)),item=items[idx],val=r[idx])
             <br/>
             topn0),]
            </p>
           </div>
           <!-- .comment-content -->
           <div class="reply">
            <a aria-label="回复给谢冰" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=4507#respond" onclick='return addComment.moveForm( "div-comment-4507", "4507", "respond", "7619" )' rel="nofollow">
             回复
            </a>
           </div>
          </article>
          <!-- .comment-body -->
          <ol class="children">
           <li class="comment odd alt depth-2" id="comment-4572">
            <article class="comment-body" id="div-comment-4572">
             <footer class="comment-meta">
              <div class="comment-author vcard">
               <img src="http://sdn.geekzu.org/avatar/87be16995347f43bcd5e7321124eb930?s=74&amp;d=monsterid&amp;r=g"/>
               <b class="fn">
                zhutianyun
               </b>
               <span class="says">
                说道：
               </span>
              </div>
              <!-- .comment-author -->
              <div class="comment-metadata">
               <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4572">
                <time datetime="2013-07-30T10:39:46+00:00">
                 2013/07/30 10:39
                </time>
               </a>
              </div>
              <!-- .comment-metadata -->
             </footer>
             <!-- .comment-meta -->
             <div class="comment-content">
              <p>
               topn&lt;-data.frame(user=rep(udata$user[1],length(idx)),item=items[idx],val=r[idx])
               <br/>
               topn0),]
              </p>
              <p>
               把下面的topn0),]删除就行了。
              </p>
             </div>
             <!-- .comment-content -->
             <div class="reply">
              <a aria-label="回复给zhutianyun" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=4572#respond" onclick='return addComment.moveForm( "div-comment-4572", "4572", "respond", "7619" )' rel="nofollow">
               回复
              </a>
             </div>
            </article>
            <!-- .comment-body -->
           </li>
           <!-- #comment-## -->
          </ol>
          <!-- .children -->
         </li>
         <!-- #comment-## -->
         <li class="comment even thread-even depth-1 parent" id="comment-4571">
          <article class="comment-body" id="div-comment-4571">
           <footer class="comment-meta">
            <div class="comment-author vcard">
             <img src="http://sdn.geekzu.org/avatar/87be16995347f43bcd5e7321124eb930?s=74&amp;d=monsterid&amp;r=g"/>
             <b class="fn">
              zhutianyun
             </b>
             <span class="says">
              说道：
             </span>
            </div>
            <!-- .comment-author -->
            <div class="comment-metadata">
             <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4571">
              <time datetime="2013-07-30T10:39:05+00:00">
               2013/07/30 10:39
              </time>
             </a>
            </div>
            <!-- .comment-metadata -->
           </footer>
           <!-- .comment-meta -->
           <div class="comment-content">
            <p>
             数据量比较大的时候，大概30万，跑本地实现的时候就会报错：
             <br/>
             &gt; co&lt;-cooccurrence(data)
             <br/>
             Error in m$x : $ operator is invalid for atomic vectors
            </p>
            <p>
             少量数据就不会报错，请教下大概是什么原因呢？
            </p>
           </div>
           <!-- .comment-content -->
           <div class="reply">
            <a aria-label="回复给zhutianyun" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=4571#respond" onclick='return addComment.moveForm( "div-comment-4571", "4571", "respond", "7619" )' rel="nofollow">
             回复
            </a>
           </div>
          </article>
          <!-- .comment-body -->
          <ol class="children">
           <li class="comment byuser comment-author-conan bypostauthor odd alt depth-2" id="comment-4603">
            <article class="comment-body" id="div-comment-4603">
             <footer class="comment-meta">
              <div class="comment-author vcard">
               <img src="http://sdn.geekzu.org/avatar/732c1985d0f02cef1d2c69df55aca7d0?s=74&amp;d=monsterid&amp;r=g"/>
               <b class="fn">
                张 丹
               </b>
               <span class="says">
                说道：
               </span>
              </div>
              <!-- .comment-author -->
              <div class="comment-metadata">
               <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-4603">
                <time datetime="2013-08-06T11:43:25+00:00">
                 2013/08/06 11:43
                </time>
               </a>
              </div>
              <!-- .comment-metadata -->
             </footer>
             <!-- .comment-meta -->
             <div class="comment-content">
              <p>
               一行一行执行cooccurrence函数里面的语句，把错误具体定位。
              </p>
             </div>
             <!-- .comment-content -->
             <div class="reply">
              <a aria-label="回复给张 丹" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=4603#respond" onclick='return addComment.moveForm( "div-comment-4603", "4603", "respond", "7619" )' rel="nofollow">
               回复
              </a>
             </div>
            </article>
            <!-- .comment-body -->
           </li>
           <!-- #comment-## -->
          </ol>
          <!-- .children -->
         </li>
         <!-- #comment-## -->
         <li class="comment even thread-odd thread-alt depth-1" id="comment-5171">
          <article class="comment-body" id="div-comment-5171">
           <footer class="comment-meta">
            <div class="comment-author vcard">
             <img src="http://sdn.geekzu.org/avatar/dc0fd1208d5d86297a3e4aa6503d0bf4?s=74&amp;d=monsterid&amp;r=g"/>
             <b class="fn">
              老贼
             </b>
             <span class="says">
              说道：
             </span>
            </div>
            <!-- .comment-author -->
            <div class="comment-metadata">
             <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-5171">
              <time datetime="2013-12-10T22:10:19+00:00">
               2013/12/10 22:10
              </time>
             </a>
            </div>
            <!-- .comment-metadata -->
           </footer>
           <!-- .comment-meta -->
           <div class="comment-content">
            <p>
             对RHADOOP感兴趣，简单用过JAVA的MapReduce，有些疑问请教一下
             <br/>
             第一步的reduce动作
             <br/>
             reduce=function(k,v){
             <br/>
             m&lt;-merge(v,v)
             <br/>
             keyval(m$x,m$y)
             <br/>
             }
             <br/>
             如果这个v巨大无比，比如有1亿行，内存装不下了，RHADOOP是否会自动处理？
             <br/>
             Java中的Reduce是做成一个iterators，数据是一行行出来的，但这句merge(v,v)看起来是把整个向量v取出来处理了（否则没法做个交叉乘法吧）。
            </p>
            <p>
             类似的情况还很多，比如和第二步的map动作
             <br/>
             map = function(k, v) {
             <br/>
             d&lt;-data.frame(k,v)
             <br/>
             d2&lt;-ddply(d,.(k,v),count)
             <br/>
             key&lt;-d2$k
             <br/>
             val&lt;-d2
             <br/>
             keyval(key,val)
             <br/>
             }
             <br/>
             count操作也是针对集合d进行，如果这个d有1亿行会怎样？内存不会爆吗？RHADOOP会自动把这件事并行到集群的节点机上吗？
             <br/>
             Java中的Map动作是一行行把k,v送进来的，当然也没法在Map里直接count了(大数据count本身就会是一个不太简单的MapReduce任务）,不过了不会有内存爆的问题。
             <br/>
             如果RHADOOP能处理这些大数据问题，那似乎不需要MapReduce，直接用R就可以了，MapReduce那个k经常是多余的。
            </p>
           </div>
           <!-- .comment-content -->
           <div class="reply">
            <a aria-label="回复给老贼" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=5171#respond" onclick='return addComment.moveForm( "div-comment-5171", "5171", "respond", "7619" )' rel="nofollow">
             回复
            </a>
           </div>
          </article>
          <!-- .comment-body -->
         </li>
         <!-- #comment-## -->
         <li class="comment odd alt thread-even depth-1" id="comment-7238">
          <article class="comment-body" id="div-comment-7238">
           <footer class="comment-meta">
            <div class="comment-author vcard">
             <img src="http://sdn.geekzu.org/avatar/f0e0e840266cd0d5fd0f5b8850a8a0e0?s=74&amp;d=monsterid&amp;r=g"/>
             <b class="fn">
              潇潇暮雨
             </b>
             <span class="says">
              说道：
             </span>
            </div>
            <!-- .comment-author -->
            <div class="comment-metadata">
             <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#comment-7238">
              <time datetime="2016-05-18T10:48:50+00:00">
               2016/05/18 10:48
              </time>
             </a>
            </div>
            <!-- .comment-metadata -->
           </footer>
           <!-- .comment-meta -->
           <div class="comment-content">
            <p>
             你好，
             <br/>
             本文中推荐的原始数据是不同用户与不同物品评分关系数据。文中讲到：“基于物品的协同过滤算法，是给用户推荐和他之前喜欢的物品相似的物品。”，如何根据用户与物品评分计算物品之间的相似度？在我看来这个实验应该是基于用户的协同过滤算法实现，不是基于物品。
             <br/>
             如有错误，请指正，信息
            </p>
           </div>
           <!-- .comment-content -->
           <div class="reply">
            <a aria-label="回复给潇潇暮雨" class="comment-reply-link" href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/?replytocom=7238#respond" onclick='return addComment.moveForm( "div-comment-7238", "7238", "respond", "7619" )' rel="nofollow">
             回复
            </a>
           </div>
          </article>
          <!-- .comment-body -->
         </li>
         <!-- #comment-## -->
        </ol>
        <!-- .comment-list -->
        <div class="comment-respond" id="respond">
         <h3 class="comment-reply-title" id="reply-title">
          发表评论
          <small>
           <a href="http://cos.name/2013/04/rhadoop3-rhadoop-mapreduce/#respond" id="cancel-comment-reply-link" rel="nofollow" style="display:none;">
            取消回复
           </a>
          </small>
         </h3>
         <form action="http://cos.name/wp-comments-post.php" class="comment-form" id="commentform" method="post" novalidate="">
          <p class="comment-notes">
           <span id="email-notes">
            电子邮件地址不会被公开。
           </span>
           必填项已用
           <span class="required">
            *
           </span>
           标注
          </p>
          <p class="comment-form-comment">
           <label for="comment">
            评论
           </label>
           <textarea aria-required="true" cols="45" id="comment" maxlength="65525" name="comment" required="required" rows="8">
           </textarea>
          </p>
          <p class="comment-form-author">
           <label for="author">
            姓名
            <span class="required">
             *
            </span>
           </label>
          </p>
          <p class="comment-form-email">
           <label for="email">
            电子邮件
            <span class="required">
             *
            </span>
           </label>
          </p>
          <p class="comment-form-url">
           <label for="url">
            站点
           </label>
          </p>
          <p class="form-submit">
          </p>
          <p style="display: none;">
          </p>
          <p style="display: none;">
          </p>
         </form>
        </div>
        <!-- #respond -->
       </div>
       <!-- #comments -->
      </div>
      <!-- #content -->
     </div>
     <!-- #primary -->
     <div class="sidebar-container" id="tertiary" role="complementary">
      <div class="sidebar-inner">
       <div class="widget-area">
        <aside class="widget widget_text" id="text-3">
         <h3 class="widget-title">
          关注统计之都
         </h3>
         <div class="textwidget">
          <ul>
           <li>
            新浪微博
            <a href="http://weibo.com/cosname">
             @统计之都
            </a>
           </li>
           <li>
            人人网
            <a href="http://renren.com/cosname">
             @统计之都
            </a>
           </li>
           <li>
            Twitter
            <a href="http://twitter.com/cos_name">
             @cos_name
            </a>
           </li>
          </ul>
         </div>
        </aside>
        <aside class="widget widget_text" id="text-6">
         <h3 class="widget-title">
          微信公众平台
         </h3>
         <div class="textwidget">
          <img src="http://cos.name/wp-content/uploads/2013/04/qrcode-8cm.jpg"/>
          <p style="font-size:12px;margin-left:15px">
           微信号 CapStat
          </p>
          <p>
           我们将第一时间向您推送主站和论坛的精彩内容，以及统计之都的线下活动、竞赛、培训和会议信息。
          </p>
         </div>
        </aside>
        <aside class="widget widget_text" id="text-8">
         <h3 class="widget-title">
          站内导航
         </h3>
         <div class="textwidget">
          <ul>
           <li class="page_item">
            <a href="http://cos.name/cn/">
             中文论坛
            </a>
           </li>
           <li class="page_item">
            <a href="http://cos.name/videos/">
             视频
            </a>
           </li>
           <li class="page_item">
            <a href="http://cos.name/salon/">
             统计沙龙
            </a>
           </li>
           <li class="page_item">
            <a href="http://cos.name/books/">
             图书出版
            </a>
           </li>
           <li class="page_item">
            <a href="http://cos.name/training/">
             教育培训
            </a>
           </li>
           <li class="page_item">
            <a href="http://cos.name/about/">
             关于我们
            </a>
           </li>
           <li class="page_item">
            <a href="http://cos.name/donate/">
             捐赠
            </a>
           </li>
           <li class="page_item">
            <a href="http://cos.name/chinar/">
             R语言会议
            </a>
           </li>
          </ul>
         </div>
        </aside>
        <aside class="widget widget_links" id="linkcat-2">
         <h3 class="widget-title">
          友情链接
         </h3>
         <ul class="xoxo blogroll">
          <li>
           <a href="http://stat.ruc.edu.cn" target="_blank" title="中国人民大学统计学院网站">
            中国人民大学统计学院
           </a>
          </li>
          <li>
           <a href="http://rucdmc.net">
            中国人民大学数据挖掘中心
           </a>
          </li>
          <li>
           <a href="http://birc.gsm.pku.edu.cn/" target="_blank">
            北京大学商务智能研究中心
           </a>
          </li>
          <li>
           <a href="http://sam.cufe.edu.cn/" target="_blank" title="中央财经大学统计与数学学院网站">
            中央财经大学统计与数学学院
           </a>
          </li>
          <li>
           <a href="http://tjx.cueb.edu.cn/" target="_blank" title="首都经济贸易大学统计学院网站">
            首经贸统计学院
           </a>
          </li>
          <li>
           <a href="http://www.shookr.com/">
            数客网大数据社区
           </a>
          </li>
          <li>
           <a href="http://www.xueqing.tv/" target="_blank" title="数据科学在线学习平台">
            雪晴数据网
           </a>
          </li>
          <li>
           <a href="http://iera.name/" target="_blank" title="IERA是一个旨在普及、传播和增进工业工程知识的非营利性网站">
            IERA（直通IE）
           </a>
          </li>
         </ul>
        </aside>
        <aside class="widget widget_categories" id="categories-2">
         <h3 class="widget-title">
          全部分类
         </h3>
         <label class="screen-reader-text" for="cat">
          全部分类
         </label>
         <select class="postform" id="cat" name="cat">
          <option value="-1">
           选择分类目录
          </option>
          <option class="level-0" value="925">
           cos访谈  (4)
          </option>
          <option class="level-0" value="659">
           图书出版  (5)
          </option>
          <option class="level-0" value="379">
           数学方法  (14)
          </option>
          <option class="level-1" value="381">
           分析与代数  (1)
          </option>
          <option class="level-1" value="380">
           概率论  (9)
          </option>
          <option class="level-1" value="382">
           随机过程  (5)
          </option>
          <option class="level-0" value="210">
           数据分析  (81)
          </option>
          <option class="level-1" value="203">
           多元统计  (3)
          </option>
          <option class="level-1" value="42">
           数据挖掘与机器学习  (42)
          </option>
          <option class="level-1" value="36">
           生物与医学统计  (17)
          </option>
          <option class="level-1" value="35">
           计量经济学  (4)
          </option>
          <option class="level-1" value="296">
           金融统计  (3)
          </option>
          <option class="level-1" value="303">
           风险精算  (7)
          </option>
          <option class="level-0" value="177">
           模型专题  (15)
          </option>
          <option class="level-1" value="38">
           回归分析  (10)
          </option>
          <option class="level-1" value="41">
           时间序列  (2)
          </option>
          <option class="level-0" value="784">
           每周精选  (24)
          </option>
          <option class="level-1" value="183">
           可视化  (9)
          </option>
          <option class="level-0" value="967">
           沙龙纪要  (3)
          </option>
          <option class="level-0" value="18">
           经典理论  (46)
          </option>
          <option class="level-1" value="37">
           抽样调查  (3)
          </option>
          <option class="level-1" value="4">
           统计推断  (26)
          </option>
          <option class="level-1" value="236">
           试验设计  (7)
          </option>
          <option class="level-1" value="39">
           非参数统计  (3)
          </option>
          <option class="level-0" value="1">
           统计之都  (279)
          </option>
          <option class="level-1" value="884">
           中国R会议  (2)
          </option>
          <option class="level-1" value="885">
           中国R语言会议  (5)
          </option>
          <option class="level-1" value="446">
           出国留学  (3)
          </option>
          <option class="level-1" value="179">
           推荐文章  (90)
          </option>
          <option class="level-1" value="3">
           新闻通知  (75)
          </option>
          <option class="level-1" value="263">
           统计刊物  (10)
          </option>
          <option class="level-1" value="174">
           网站导读  (40)
          </option>
          <option class="level-1" value="204">
           职业事业  (51)
          </option>
          <option class="level-1" value="213">
           高校课堂  (9)
          </option>
          <option class="level-0" value="178">
           统计计算  (28)
          </option>
          <option class="level-1" value="40">
           优化与模拟  (15)
          </option>
          <option class="level-1" value="43">
           贝叶斯方法  (6)
          </option>
          <option class="level-0" value="378">
           软件应用  (116)
          </option>
          <option class="level-1" value="44">
           统计图形  (36)
          </option>
          <option class="level-1" value="110">
           统计软件  (83)
          </option>
         </select>
        </aside>
        <aside class="widget widget_recent_comments" id="recent-comments-2">
         <h3 class="widget-title">
          最新评论
         </h3>
         <ul id="recentcomments">
          <li class="recentcomments">
           <span class="comment-author-link">
            fineboom
           </span>
           发表在《
           <a href="http://cos.name/2016/06/use-shiny-fleetly-set-up-visual-prototype-system/#comment-7317">
            利用shiny包快速搭建可视化原型系统
           </a>
           》
          </li>
          <li class="recentcomments">
           <span class="comment-author-link">
            胡家新
           </span>
           发表在《
           <a href="http://cos.name/2016/06/r%e8%af%ad%e5%8d%83%e5%af%bb%e7%ac%ac%e4%b8%89%e6%9c%9f%ef%bc%9a%e5%bc%a0%e6%97%a0%e5%bf%8c%e7%a9%b6%e7%ab%9f%e7%88%b1%e8%b0%81%ef%bc%9f/#comment-7316">
            R语千寻第三期：张无忌究竟爱谁？
           </a>
           》
          </li>
          <li class="recentcomments">
           <span class="comment-author-link">
            <a class="url" href="http://www.zijiacha.com/category.php?id=6" rel="external nofollow">
             南糯山普洱茶
            </a>
           </span>
           发表在《
           <a href="http://cos.name/2016/06/r%e8%af%ad%e5%8d%83%e5%af%bb%e7%ac%ac%e4%b8%89%e6%9c%9f%ef%bc%9a%e5%bc%a0%e6%97%a0%e5%bf%8c%e7%a9%b6%e7%ab%9f%e7%88%b1%e8%b0%81%ef%bc%9f/#comment-7315">
            R语千寻第三期：张无忌究竟爱谁？
           </a>
           》
          </li>
          <li class="recentcomments">
           <span class="comment-author-link">
            J
           </span>
           发表在《
           <a href="http://cos.name/2016/05/value-of-the-reputation-from-the-data/#comment-7314">
            数据告诉你：高信誉的卖家应该收高价，还是收低价？
           </a>
           》
          </li>
          <li class="recentcomments">
           <span class="comment-author-link">
            <a class="url" href="http://gg" rel="external nofollow">
             Hilda
            </a>
           </span>
           发表在《
           <a href="http://cos.name/2013/01/drawing-map-in-r-era/#comment-7311">
            R时代，你要怎样画地图？
           </a>
           》
          </li>
         </ul>
        </aside>
        <aside class="widget widget_rss" id="rss-282869971">
         <h3 class="widget-title">
          <a class="rsswidget" href="http://cos.name/cn/topics/feed/">
           <img src="http://cos.name/wp-includes/images/rss.png"/>
          </a>
          <a class="rsswidget" href="http://cos.name/cn/topics/feed/">
           中文论坛新帖
          </a>
         </h3>
         <ul>
          <li>
           <a class="rsswidget" href="http://cos.name/cn/topic/417372/">
            处理时间数据和产生时间序列的问题
           </a>
          </li>
          <li>
           <a class="rsswidget" href="http://cos.name/cn/topic/6790/">
            《统计陷阱》下载 （How to lie with statistics）
           </a>
          </li>
          <li>
           <a class="rsswidget" href="http://cos.name/cn/topic/818/">
            统计学的世界（第五版）
           </a>
          </li>
          <li>
           <a class="rsswidget" href="http://cos.name/cn/topic/16574/">
            class(x) 返回值值是AsIs,AsIs代表什么，有什么用处？
           </a>
          </li>
          <li>
           <a class="rsswidget" href="http://cos.name/cn/topic/417366/">
            如何用R绘制一个分类算法的决策规则
           </a>
          </li>
         </ul>
        </aside>
        <aside class="widget widget_text" id="text-2">
         <h3 class="widget-title">
          登录/RSS
         </h3>
         <div class="textwidget">
          <ul>
           <li>
            <a href="http://cos.name/wp-admin/">
             登录
            </a>
           </li>
           <li>
            <a href="http://cos.name/feed/" title="使用 RSS 2.0 同步站点内容">
             文章
             <abbr title="Really Simple Syndication">
              RSS
             </abbr>
            </a>
           </li>
           <li>
            <a href="http://cos.name/comments/feed/" title="RSS 上的最近评论">
             评论
             <abbr title="Really Simple Syndication">
              RSS
             </abbr>
            </a>
           </li>
          </ul>
         </div>
        </aside>
       </div>
       <!-- .widget-area -->
      </div>
      <!-- .sidebar-inner -->
     </div>
     <!-- #tertiary -->
    </div>
    <!-- #main -->
    <footer class="site-footer" id="colophon" role="contentinfo">
     <div class="site-info">
      版权所有 © 2014 统计之都 | 由
      <a href="http://wordpress.org/">
       WordPress
      </a>
      构建 | 主题修改自
      <a href="http://wordpress.org/themes/twentythirteen">
       Twenty Thirteen
      </a>
     </div>
     <!-- .site-info -->
    </footer>
    <!-- #colophon -->
   </div>
   <!-- #page -->
   <p style="margin:0;padding:0;height:1px;overflow:hidden;">
    <a href="http://www.wumii.com/widget/relatedItems" style="border:0;">
     <img src="http://static.wumii.cn/images/pixel.png"/>
    </a>
   </p>
  </div>
 </body>
</html>